Матч
413, Бесконечная последовательность (InfiniteSequence)
Дивизион 2,
Уровень 3
Рассмотрим бесконечную
последовательность А, определенную следующим образом:
A0 = 1,
Ai = A[i/p]
+ A[i/q] , i ³ 1
По заданным n, p, q вычислить An.
Класс: InfiniteSequence
Метод: long long
calc(long long n, int p, int q)
Ограничения: 0 £ n £ 1012,
2 £ p, q £ 109.
Вход. Целые значения n, p, q.
Выход. Значение An.
Пример входа
n |
p |
q |
0 |
2 |
3 |
10000000 |
3 |
3 |
256 |
2 |
4 |
Пример выхода
1
32768
89
РЕШЕНИЕ
структуры данных – map, рекурсия
Вычислить все значения Ai (i = 0, 1, …, n) последовательности
невозможно при помощи массива из-за ограничения n £ 1012. Для запоминания
результатов будем использовать структуру map: значение m[i] будет хранить Ai.
Находим значение An,
запоминая промежуточные результаты.
ПРОГРАММА
#include <cstdio>
#include <map>
using namespace
std;
map<long long,long long> m;
class InfiniteSequence
{
public:
long long calc(long long n, int p, int q)
{
if (m[n]) return
m[n];
if (!n) return 1;
return m[n] = calc(n/p,p,q) + calc(n/q,p,q);
}
};